<?php
namespace app\controller;

use app\BaseController;
use app\model\DeviceGroup as DeviceGroupModel;
use think\facade\Validate;
use think\facade\Db;

class DeviceGroup extends BaseController
{
    /**
     * 获取设备组列表
     */
    public function index()
    {
        // 获取请求参数
        $params = $this->request->get();
        
        // 构建查询
        $query = DeviceGroupModel::withSearch(['name', 'parent_id'], $params);
        
        // 是否获取树形结构
        $tree = isset($params['tree']) && $params['tree'] == 1;
        
        if ($tree) {
            // 查询顶级分组
            $list = $query->where('parent_id', 0)->select();
            
            // 递归获取子分组
            foreach ($list as &$item) {
                $item = $this->getGroupChildren($item);
            }
        } else {
            // 按名称排序
            $query = $query->order('name');
            
            // 分页
            $list = $query->paginate([
                'list_rows' => $params['pageSize'] ?? 10,
                'page' => $params['page'] ?? 1,
            ]);
        }
        
        return $this->success('获取成功', $list);
    }
    
    /**
     * 递归获取子分组
     * @param DeviceGroupModel $group 设备组
     * @return DeviceGroupModel
     */
    private function getGroupChildren($group)
    {
        $children = DeviceGroupModel::where('parent_id', $group->id)->select();
        
        if (!$children->isEmpty()) {
            foreach ($children as &$child) {
                $child = $this->getGroupChildren($child);
            }
            $group->setAttr('children', $children);
        } else {
            $group->setAttr('children', []);
        }
        
        return $group;
    }
    
    /**
     * 添加设备组
     */
    public function add()
    {
        // 获取请求数据
        $data = $this->request->post();
        
        // 验证数据
        $validate = Validate::rule([
            'name' => 'require',
            'parent_id' => 'number',
        ]);
        
        if (!$validate->check($data)) {
            return $this->error('参数错误：' . $validate->getError());
        }
        
        // 验证父级设备组是否存在
        if (!empty($data['parent_id'])) {
            $parent = DeviceGroupModel::find($data['parent_id']);
            if (!$parent) {
                return $this->error('父级设备组不存在');
            }
            
            // 设置层级和路径
            $data['level'] = $parent->level + 1;
        } else {
            // 顶级设备组
            $data['parent_id'] = 0;
            $data['level'] = 1;
        }
        
        try {
            // 创建设备组
            $group = new DeviceGroupModel($data);
            $group->save();
            
            // 更新路径
            if (!empty($data['parent_id'])) {
                $path = $parent->path ? $parent->path . ',' . $group->id : $group->id;
            } else {
                $path = strval($group->id);
            }
            $group->path = $path;
            $group->save();
            
            return $this->success('添加成功', $group);
        } catch (\Exception $e) {
            return $this->error('添加失败：' . $e->getMessage());
        }
    }
    
    /**
     * 编辑设备组
     */
    public function edit()
    {
        // 获取请求数据
        $data = $this->request->put();
        
        // 验证参数
        $validate = Validate::rule([
            'id' => 'require|number',
            'name' => 'require',
        ]);
        
        if (!$validate->check($data)) {
            return $this->error('参数错误：' . $validate->getError());
        }
        
        // 查询设备组
        $group = DeviceGroupModel::find($data['id']);
        if (!$group) {
            return $this->error('设备组不存在');
        }
        
        // 不允许修改父级ID，避免层级关系混乱
        unset($data['parent_id']);
        
        try {
            // 更新设备组
            $group->save($data);
            
            return $this->success('更新成功', $group);
        } catch (\Exception $e) {
            return $this->error('更新失败：' . $e->getMessage());
        }
    }
    
    /**
     * 删除设备组
     * @param int $id 设备组ID
     */
    public function delete($id)
    {
        // 查询设备组
        $group = DeviceGroupModel::find($id);
        if (!$group) {
            return $this->error('设备组不存在');
        }
        
        // 检查是否有子设备组
        $childrenCount = DeviceGroupModel::where('parent_id', $id)->count();
        if ($childrenCount > 0) {
            return $this->error('存在子设备组，无法删除');
        }
        
        // 检查是否有关联设备
        $deviceCount = Db::name('device')->where('group_id', $id)->count();
        if ($deviceCount > 0) {
            return $this->error('设备组下存在设备，无法删除');
        }
        
        try {
            // 软删除设备组
            $group->delete();
            
            return $this->success('删除成功');
        } catch (\Exception $e) {
            return $this->error('删除失败：' . $e->getMessage());
        }
    }
    
    /**
     * 获取设备组详情
     * @param int $id 设备组ID
     */
    public function detail($id)
    {
        // 获取请求数据
        $id = $this->request->get('id');// 查询设备组

        $group = DeviceGroupModel::find($id);
        if (!$group) {
            return $this->error('设备组不存在');
        }
        
        // 获取父级设备组
        if ($group->parent_id > 0) {
            $group->parent = DeviceGroupModel::find($group->parent_id);
        }
        
        // 获取完整路径名称
        $group->full_path_name = $group::getFullPathName($group->parent);
        
        return $this->success('获取成功', $group);
    }
} 